#include"blockQueue.hpp"
#include"task.hpp"
#include<ctime>
#include<functional>
using namespace zdl;
using namespace taskMoudle;

using task_t  = std::function<void()>;
int main()
{
    auto bq = new blockQueue<task_t>(5);  // 共享资源
    auto consumer = 
    [](void* args) ->void*
    {
        auto bq = static_cast<blockQueue<task_t>*> (args);
        // zdl:: 消费者一定要拿到自己想要的数据去！！！
        int data;
        while (true)
        {
            task_t t;
            t = bq->pop();
            sleep(1);
            t.excute();
            std::cout << "consumer get a task about : " 
            << t.X() << "+" << t.Y() << "=" << t.Ret() << std::endl;
        }

        return nullptr;
    };
    auto producter = 
    [](void* args) ->void*
    {
        auto bq = static_cast<blockQueue<task_t>*> (args);
        int data = 10;
        while (true)
        {
            // zdl:: 现在就是我们直接手动创建一个任务
            int x = rand() % 10 + 1;
            int y = rand() % 20 + 1;
            task t(x, y);
            bq->equeue(t);

            std::cout << "生产了一个任务: "  << t.X() << "+" 
            << t.Y() << "=?" << std::endl;
            data++;
        }
        return nullptr;
    };
    srand(time(nullptr) ^ getpid());
    //  ! 交易场所不知可以传递数，还可以传递任务
    pthread_t c, /*c1, p,*/ p; // 消费者和生产者    
    pthread_create(&c, nullptr, consumer, bq);
    // pthread_create(&c1, nullptr, consumer, bq);
    pthread_create(&p, nullptr, producter, bq);
    // pthread_create(&p1, nullptr, producter, bq);
    // pthread_create(&p2, nullptr, producter, bq);
    // zdl::blockQueue<task_t> *bq
    pthread_join(c, nullptr);
    pthread_join(p, nullptr);
    delete bq;
    return 0;
}